package com.tmxk.jdbc04.service;

import com.tmxk.jdbc04.constants.ScheduleStatus;
import com.tmxk.jdbc04.dao.ScheduleDao;
import com.tmxk.jdbc04.dao.TripModeDao;
import com.tmxk.jdbc04.po.Schedule;
import com.tmxk.jdbc04.po.TripMode;
import com.tmxk.jdbc04.utils.TimeCheckedUtils;
import org.apache.log4j.Logger;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**
 * 出差行程业务数据处理
 */
public class ScheduleMgr {
    //定义Logger日志实例
    private Logger logger = Logger.getLogger(ScheduleMgr.class);
    /**
     * 显示所有行程列表业务信息
     */
    public void showScheduleInfo(TripModeDao tripModeDao, ScheduleDao scheduleDao , Scanner sc){
        System.out.println("\n【查询条件1】显示所有出行方式:");
        // 定义Map集合对象,用来存储出行方式, key 是 ID , value 是 name
        Map<Integer, String> mapTrip = queryMapTrip(tripModeDao,"query");

        System.out.print("\n\n请选择出行方式(不输入任何字符串信息,默认不查询该条件):");
        // 查询条件 1 根据出行方式进行条件筛选
        String chose = sc.nextLine();
        // 创建一个Map集合对象,作为条件查询参数,并初始化Map集合对象
        Map<String, Object> map = new HashMap<>();
        if (chose != null && !"".equals(chose)) {
            map.put("tripModeId", chose);
        }

        // 查询条件 2 根据出行日期进行条件筛选
        System.out.println("\n【查询条件2】根据出行日期进行条件筛选");
        System.out.print("请输入出行日期(不输入任何字符串信息,默认不查询该条件):");
        String tripTime = sc.nextLine();
        // if输入字符串数据,校验输入的时间格式是否正确
        if (tripTime != null && !"".equals(tripTime)) {
            while (!TimeCheckedUtils.checkTime(tripTime)) {
                System.out.print("\n出行日期时间输入格式有误,请重新输入:");
                tripTime = sc.nextLine();
            }
            // 添加 出行日期时间
            map.put("tripTime", tripTime);
        }

        // 查询条件 3 根据行程状态进行条件筛选
        System.out.println("\n【查询条件3】根据行程状态进行条件筛选");
        // 获取行程状态枚举类所有数据
        ScheduleStatus[] tripStatus = ScheduleStatus.values();
        //定义一个字符串增强类,用来拼接字符信息
        StringBuffer str = new StringBuffer();
        for (int i = 0; i < tripStatus.length; i++) {
            str.append(tripStatus[i].getCode() + ":" + tripStatus[i].getValue() + "\t");
        }
        System.out.print("请选择行程状态(不输入任何字符串信息,默认不查询该条件):" + str);
        String status = sc.nextLine();
        if (status != null && !"".equals(status)) {
            //添加行程状态值
            map.put("tripStatus", status);
        }

        System.out.println("\n显示所有出行信息");

        List<Schedule> scheduleList = scheduleDao.queryScheduleByType(map);
        System.out.println("出差人员\t\t职务\t\t\t出行方式\t\t出行日期\t\t\t行程状态\t\t操作");
        for (Schedule s : scheduleList) {
            // 出差人员姓名
            String userName = s.getUserName().length() == 2 ? s.getUserName().concat(" ") : s.getUserName();
            //职务
            String duty = s.getDuty().length() == 2 ? s.getDuty().concat("   ") : s.getDuty();
            System.out.println(userName + "\t\t" + duty + "\t\t" +
                    mapTrip.get(s.getTripModeId()) + "\t\t" + s.getDepartTime() + "\t\t" +
                    ScheduleStatus.getScheduleStatusByCode(s.getStatus()).getValue());
        }
    }

    /**
     * 录入出差行程信息
     * @param tripModeDao
     * @param scheduleDao
     * @param sc
     */
    public void saveScheduleInfo(TripModeDao tripModeDao, ScheduleDao scheduleDao, Scanner sc) {
        //创建行程信息Schedule实体类
        Schedule schedule = new Schedule();
        System.out.println("添加出行计划");
        System.out.print("请输入出差人员(*):");
       // String userName = sc.nextLine();
        schedule.setUserName(sc.nextLine());
        System.out.print("请输入出差人职务(*)");
        String duty = sc.nextLine();
        //出行方式
        Map<Integer, String> mapTrip = queryMapTrip(tripModeDao,"save");
        StringBuffer tripStr = new StringBuffer();
        for (Integer key : mapTrip.keySet()){
            tripStr.append(key + "." + mapTrip.get(key) + "\t");
        }
        System.out.print("请选择出行方式:".concat(tripStr.toString()));
        String tripNo = sc.nextLine();
        System.out.print("请输入出行日期(*)");
        String tripTime = sc.nextLine();
        while (!TimeCheckedUtils.checkTime(tripTime)){
            System.out.print("时间格式输入有误,请重新输入出行日期(*)");
            tripTime = sc.nextLine();
        }
        // 调用保存行程信息方法
        schedule.setDuty(duty);
        schedule.setTripModeId(Integer.parseInt(tripNo));
        schedule.setDepartTime(tripTime);
        int addRes = scheduleDao.saveSchedule(schedule);
      //  System.out.println(addRes > 0 ? "录入成功!" : "录入失败!!!");
        logger.debug(addRes > 0 ? "录入成功!" : "录入失败!!!");

    }

    /**
     * 公共方法,获取出行方式
     * @return
     */
    public Map<Integer, String> queryMapTrip(TripModeDao tripModeDao,String flag){
        // 获取所有出行方式信息
        List<TripMode> tripModeList = tripModeDao.queryAllTripMode();
        // 定义Map集合对象,用来存储出行方式, key 是 ID , value 是 name
        Map<Integer, String> mapTrip = new HashMap<>();
        for (TripMode tm : tripModeList) {
            if("query".equals(flag)){
                System.out.print(tm.getId() + "." + tm.getName() + "\t\t");
            }
            // 将获取的 id 和 name存储到mapTrip集合对象中
            mapTrip.put(tm.getId(), tm.getName());
        }
        return mapTrip;
    }

    /**
     * 取消行程状态
     * @param tripModeDao
     * @param scheduleDao
     * @param sc
     */
    public void updateScheduleInfo(TripModeDao tripModeDao, ScheduleDao scheduleDao, Scanner sc) {
        //行程实例对象
        Schedule schedule = new Schedule();
        System.out.print("请输入取消行程出差人员姓名:");
        String userName = sc.nextLine();
        schedule.setUserName(userName);
        Map<String,Object> map = new HashMap<>();
        map.put("userName",userName);
        // 根据出差人员姓名获取对应ID
        List<Schedule> scheduleList = scheduleDao.queryScheduleByType(map);
        if (scheduleList != null && scheduleList.size() > 0 ) {
            // 获取到对应行程数据
            // 根据出差人员姓名获取对应ID
            schedule.setId(scheduleList.get(0).getId());
            schedule.setStatus(1);
            int updateRes = scheduleDao.updateScheduleById(schedule);
          //  System.out.println(updateRes > 0 ?  userName + "行程已取消!!!" :  userName + "行程取消失败!!!");
            logger.info(updateRes > 0 ?  userName + "行程已取消!!!" :  userName + "行程取消失败!!!");
        }else{
           // System.out.println(userName + "用户信息不在员工出差管理平台中");
            logger.debug(userName + "用户信息不在员工出差管理平台中");
        }
    }
}
